package com.cskaoyan.service.impl;

import com.cskaoyan.bean.AdminListParameter;
import com.cskaoyan.bean.PageData;
import com.cskaoyan.mapper.MarketAdminMapper;
import com.cskaoyan.model.MarketAdmin;
import com.cskaoyan.model.MarketAdminExample;
import com.cskaoyan.service.AdminService;
import com.cskaoyan.utils.MyBatisUtil;
import com.cskaoyan.utils.TransactionUtil;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.session.SqlSession;

import java.util.Date;
import java.util.List;

/**
 * @Author Pudding
 * @Date 2024/5/30 10:36
 */
public class AdminServiceImpl implements AdminService {
    @Override
    public PageData list(AdminListParameter parameter) {
        //根据请求参数获取data中的list数据

        //1， page、limit做分页：通过分页插件
        PageHelper.startPage(parameter.getPage(), parameter.getLimit());

        //下面都是通过Example类进行
        //2.1 sort、order做排序：通过Example类（mybatis的逆向工程），提供了排序、拼接条件功能
        MarketAdminExample example = new MarketAdminExample();
        example.setOrderByClause(parameter.getSort() + " " + parameter.getOrder());
        //2.2 增加条件：没有被逻辑删除的
        MarketAdminExample.Criteria criteria = example.createCriteria();
        criteria.andDeletedEqualTo(false);
        //2.3 条件查询：先判断传进来的参数是否为空，不为空才拼接条件
        if (parameter.getUsername() != null) {
            criteria.andUsernameLike("%" + parameter.getUsername() + "%");
        }

        //3. 通过mybatis进行查询数据（example封装了排序+条件）
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        MarketAdminMapper adminMapper = sqlSession.getMapper(MarketAdminMapper.class);
        List<MarketAdmin> marketAdmins = adminMapper.selectByExample(example);
        //3.1 将查询的数据data中的list封装到pageData，直接调用方法即可
        PageData pageData = PageData.list(marketAdmins);
        //3.2 返回pageData的数据给servlet进行响应
        return pageData;
    }

    @Override
    public MarketAdmin create(MarketAdmin marketAdmin) {
        //根据请求体的json数据进行新增管理员
        //1. 调用mybatis进行新增数据到market_admin数据表
        MarketAdminMapper adminMapper = TransactionUtil.getMapper(MarketAdminMapper.class);

        //2. 构造要添加数据封装的对象，这里我们使用的对象依旧是MarketAdmin
        //2.1 是同名，不允许添加到数据库
        String username = marketAdmin.getUsername();
        MarketAdmin adminJudge = adminMapper.selectByUsername(username);
        if (adminJudge != null) {
            return null;
        }
        //2.2 不是同名，即添加到数据库
        MarketAdmin admin = MarketAdmin.builder()
                .addTime(new Date())
                .avatar(marketAdmin.getAvatar())
                .password(marketAdmin.getPassword())
                .roleIds(marketAdmin.getRoleIds())
                .updateTime(new Date())
                .username(username)
                .build();


        //3. 将该对象数据添加到数据库表中
        adminMapper.insertSelective(admin);

        //4. 返回一个响应报文中的data数据，这个data数据是一个MarketAdmin对象封装的
        //这里响应报文数据和我们上面封装对象数据对应，所有我们可以直接拿过来用
        return admin;
    }

    @Override
    public MarketAdmin update(MarketAdmin marketAdmin) {
        //根据请求体的json数据进行更新管理员
        //1. 调用mybatis进行更新market_admin数据表数据
        MarketAdminMapper adminMapper = TransactionUtil.getMapper(MarketAdminMapper.class);

        //2. 构造要修改数据封装的对象，这里我们使用的对象依旧是MarketAdmin
        //2.1 是同名，不允许添加到数据库
        String username = marketAdmin.getUsername();
        MarketAdmin adminJudge = adminMapper.selectByUsername(username);
        if (adminJudge != null) {
            return null;
        }

        /*MarketAdmin admin = MarketAdmin.builder()
                .avatar(marketAdmin.getAvatar())
                .password(marketAdmin.getPassword())
                .roleIds(marketAdmin.getRoleIds())
                .updateTime(new Date())
                .username(marketAdmin.getUsername())
                .build();*/
        marketAdmin.setUpdateTime(new Date());

        //3. 将该对象数据更新到数据库表中
        adminMapper.updateByPrimaryKeySelective(marketAdmin);

        //4. 返回一个响应报文中的data数据，这个data数据是一个MarketAdmin对象封装的
        //这里响应报文数据和我们上面封装对象数据对应，所有我们可以直接拿过来用
        return marketAdmin;
    }

    @Override
    public void delete(MarketAdmin marketAdmin) {
        //根据请求体的json数据进行删除管理员
        //1. 调用mybatis进行删除market_admin数据表数据
        MarketAdminMapper adminMapper = TransactionUtil.getMapper(MarketAdminMapper.class);

        //2. 获取要删除数据表数据的id，也就是marketAdmin的id
        Integer id = marketAdmin.getId();

        //3. 根据这个id删除数据表中的这条数据
        adminMapper.deleteByPrimaryKey(id);
    }

}
